#include <iostream>
#include <cstring>

using namespace std;

class Solution
{
public:
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param n int整型
     * @param m int整型
     * @return int整型
     */
    static const int N = 1e4 + 10;
    int LastRemaining_Solution(int n, int m)
    {
        // write code here
        // 1. 模拟
        // 解决这个问题就是考验代码能力了
        int a[N];
        bool vis[N];
        memset(vis, false, sizeof(vis));
        int count = n;
        int j = 0, c = 0;
        while (count != 1)
        {
            if (!vis[j] && c == m - 1)
            {
                vis[j] = true;
                c = 0;
                count--;
                cout <<  "j = " << j << endl;
            }
            if (vis[j])
            {
                j++;
                j %= n;
                continue;
            }
            c++;
            j++;
            j %= n;
        }
        int index = 0;
        while (vis[index])
        index++;
        return index;
        // 2. 动态规划
        // 理解他其实就是一个简单的下标映射问题
    }
};

int main()
{
    Solution s;
    s.LastRemaining_Solution(5, 2);
    return 0;
}